package main

import (
	"fmt"
	"time"
)

func main() {

	// 有缓冲的channel:是一次性把channel的缓存容量都填满
	// 简单定义一个有缓冲的channel
	c := make(chan int, 3) // 该channel的容量为3
	// fmt.Printf("len(c) = %v cap(c) = %v\n", len(c), cap(c))

	// 创建一个go线程，往channel管道中插入数据
	go func() {
		defer fmt.Println("go线程结束")

		for i := 0; i < 5; i++ {
			// 插入数据
			c <- i
			fmt.Println("go线程正在运行，发送的元素为", i, "len(c) = ", len(c), "cap(c) = ", cap(c))
		}
	}()

	time.Sleep(2 * time.Second)
	

	// 在主线程中一条一条的消费数据
	for i := 0; i < 5; i++ {
		data := <-c
		fmt.Println("data=", data)
	}

	fmt.Println("main线程结束")
	

	/* 总结：有缓存的channel管道，当初始容量填满了以后，再添加数据则会发生阻塞
		只能等待第一次添加的消息被消费完才有空间再让数据插入进去，这个时候可以知道，
		消费第一条消息永远比插入容量+1条数据先执行~
	*/
}
